package qin_jie;

public class QIN_JIE_TH_Q2<K> {

    /**
     * @Description:根据队列的原理使用单链表自定义一个队列，实现进入队列，出队列
     * @Author: QINJIE
     * @Date: 2021/1/23
     **/

    private int size=5;    //队列的容量
    private int length=0;  //当前队列在多少元素
    private Node<K> nodelist; //单链表

    //队列的构造方法 初始化
    public QIN_JIE_TH_Q2(){
        this.nodelist=new Node(null,null);
    }

    //节点类
    class Node<K>{

        private K k;          //节点保存的值
        private Node<K> next; //指向下一个节点

        public Node(K k,Node<K> next){
            this.k=k;
            this.next=next;
        }
    }

    /**
     * @Description:进队列
     * @Author: QINJIE
     * @Date: 2021/1/23
     * @param k
     * @return: void
     **/
    public void put(K k){
        //先判断队列空间是否已满
        if(this.length<this.size){

            //队列为空时直接赋值并返回
            if(this.length==0){
                this.nodelist=new Node(k,null);
                this.length++;
                return;
            }

            //设置一个变量保存当前node
            Node curr = this.nodelist;
            //循环找到队列的最后一个空位并赋值
            for(int i=0;i<this.length;i++){
                //如果当前节点下一个为null，说明为最后一个节点
                if(curr.next==null){
                    curr.next=new Node(k,null);
                    this.length++;
                    return;
                }
                //指向下一个节点
                curr=curr.next;
            }
        }else{
            System.out.println("溢出了");
        }
    }

    /**
     * @Description:根据索引查队列中元素的值
     * @Author: QINJIE
     * @Date: 2021/1/23
     * @param index
     * @return: K
     **/
    public K get(int index){
        if(index < this.size && index >=0){
            Node<K> curr = this.nodelist;
            for (int i=0;i<index;i++){
                curr=curr.next;
            }
            return curr.k;
        }
        return null;
    }

    /**
     * @Description:出队列
     * @Author: QINJIE
     * @Date: 2021/1/23
     * @param
     * @return: K
     **/
    public K out(){
        if(this.length==0){
            return null;
        }
        Node<K> curr = this.nodelist;
        Node<K> after = this.nodelist.next;
        this.nodelist = new Node<K>(after.k,after.next);
        this.length--;
        return curr.k;
    }


    // 主方法
    public static void main(String[] args) {
        //1 、实现进队列
        QIN_JIE_TH_Q2<Integer> queue = new QIN_JIE_TH_Q2();
        //循环存五个数进队列
        for (int i=0;i<5;i++){
            queue.put(i);
        }
        //获取结果
        System.out.println("队列当前进入的元素数:"+queue.length);
        for (int i=0;i<queue.length;i++){
            System.out.println("element:"+queue.get(i));
        }

        //2 、实现元素出队列
        int outKey = queue.out();
        System.out.println("队列当前出来的元素:"+outKey);
        int outKey1 = queue.out();
        System.out.println("队列当前出来的元素:"+outKey1);
        int outKey2 = queue.out();
        System.out.println("队列当前出来的元素:"+outKey2);
        for (int i=0;i<queue.length;i++){
            System.out.println("剩余element:"+queue.get(i));
        }
    }

}
